/*
 * servidor.c - t4/t5
 * A. Justo & Tiago Cavaco
 */

#include "chat.c"

int run = 1;

extern void receberMensagens(void *ncliente)
{
	while (run == 1)
	{
		int minhaFila = (int)ncliente;

		recebeMensagem(filas[minhaFila], SEND_BY_CLIENT);

		printf("Mensagem %s do cliente %d\n", m.msgText, minhaFila);

		char cabecalho[100];
		char *tokResult = strtok (m.msgText, " ");

		strcpy(cabecalho,tokResult);

		if (strcmp("fim\n", cabecalho) == 0) //fechar a fila deste cliente
		{
			msgctl (filas[minhaFila], 0, IPC_RMID);
			pthread_exit(0);
		}
		else
		{
			char* text = strtok(NULL, "\n");
			if (strcmp("todos", cabecalho) == 0) //enviar para todos
			{
				printf("Mensagem a enviar para todos.\n");
				enviaMensagem(text);
			}
			else
				enviaMensagemPrivada(atoi(cabecalho), text);	
		}
	}	
}

void terminar ()
{
	int i;
	//eliminar todas as filas anteriormente criadas
	for (i =1; i <= clientes; i++)
		msgctl (filas[i], 0, IPC_RMID);
	run = 0;
	exit(1);
}

int main (int argc, char **argv)
{
	int i;

	//Verifica se é indicado um número de clientes a conectar ao servidor.
	
	if (argc != 2)
	{
		printf("Indique o numero de clientes.\n");
		exit(1);
	}

	clientes = atoi(argv[1]);

	pthread_t t[clientes];

	//sinal que associa o ctrl+c à função terminar
	signal (SIGINT, terminar);

	/*cria um numero N de filas, consoante o indicado em clientes*/
	printf("Criadas %d filas!\n", clientes);
	for (i = 1; i <= clientes; i++)
	
		filas[i] = msgget(KEY+i, 0666 | IPC_CREAT | IPC_EXCL);

	/*cria um numero N de threads, consoante o indicado em clientes*/
	for (i = 1; i <= clientes; i++)
	{
		pthread_create(&t[i], NULL, receberMensagens, i ); 
	}

	for (i = 1; i <= clientes; i++)
	{
		pthread_join(t[i], NULL );
	}

	printf("Não existem mais clientes ligados. Servidor encerrado.\n");
	return 0;
}
